// 串口通信

#ifndef SERIALCOMMUNICATOR_HPP
#define SERIALCOMMUNICATOR_HPP

#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <unistd.h>
#include <wiringPi.h>
#include <wiringSerial.h>

class SerialCommunicator {
public:
	// 构造函数
	SerialCommunicator(const std::string &uart_dev);
	// 析构函数
	~SerialCommunicator();

	// 串口数据发送
	template <typename T>
	bool sendData(const T &cmd);

	// 接收串口数据
	std::vector<uint8_t> receiveData();

private:
	const int baudRate = 115200;  // 波特率
	int uart_fd;                  // 串口文件描述符
	std::vector<uint8_t> buffer;  // 存储串口数据
};

/**
 * 通过串口发送数据
 *
 * @param data 待发送的字节数组指针
 * @param length 待发送数据的长度（字节）
 * @return 发送成功返回true，失败返回false
 */
template <typename T>
bool SerialCommunicator::sendData(const T &cmd) {
	if (uart_fd == -1) {
		std::cerr << "串口文件描述符异常: " << strerror(errno) << std::endl;
		return false;
	}

	serialFlush(uart_fd); // 清空串口缓冲中的所有可用的数据
	int bytesWritten = write(uart_fd, cmd.data(), cmd.size());
	if (bytesWritten == -1) {
		std::cerr << "串口写入失败: " << strerror(errno) << std::endl;
		return false;
	}
	return true;
}
#endif // !SERIALCOMMUNICATOR_HPP